iT邦幫忙

2024 iThome 鐵人賽

DAY 2
0

今天來介紹一下什麼是中間人攻擊!且可利用什麼專業技術防止被入侵~

中間人攻擊(Man-in-the-Middle Attack, MITM)是一種網路安全攻擊,攻擊者會在兩方之間攔截和操控通信,讓雙方以為他們正在直接且安全地進行通信,實際上攻擊者已經插入到通信之中,並可能竊取、修改或偽造傳輸的數據。

中間人攻擊的運作方式

  1. 攔截通信:攻擊者通常會在雙方的通信鏈路上進行攔截。這可以通過多種方式實現,例如使用惡意軟件、竊取不安全的網路連接(如公共 Wi-Fi),或者利用 DNS 欺騙等技術。

  2. 冒充身份:攻擊者通過偽裝成通信的其中一方,讓雙方相信他們是在和正確的對象通信。攻擊者通常會同時和雙方通信,但每次都修改或查看消息。

  3. 修改數據:除了竊取數據,攻擊者還可以篡改信息內容,偽造交易或進行欺詐行為。例如,攻擊者可以攔截和修改金融交易信息,讓交易指令被重新導向他們自己的帳戶。

中間人攻擊的常見方式

  1. Wi-Fi 攔截:攻擊者在公共 Wi-Fi 上運行一個偽造的接入點,誘騙受害者連接上這個接入點,使他們的所有通信都經過攻擊者的設備。這樣,攻擊者就可以監控並篡改通信內容。

  2. DNS 欺騙:攻擊者修改受害者的 DNS 查詢結果,將他們導向偽造的網站或服務,然後進行數據攔截。

  3. SSL 剝離:攻擊者通過將 HTTPS 網站的通信降級到不安全的 HTTP,使受害者的數據暴露在明文中,這樣他們就能夠竊取或修改信息。

  4. 會話劫持:攻擊者通過攔截受害者的會話 Cookie,偽裝成合法用戶,並劫持他們的會話。

中間人攻擊的危害

  • 數據竊取:攻擊者可以獲取敏感信息,如用戶名、密碼、信用卡號等。
  • 隱私洩露:個人通信、電子郵件或其他隱私數據可能會被攻擊者攔截並使用。
  • 金融損失:攻擊者可以竊取或修改金融交易信息,導致金錢損失。
  • 假冒身份:攻擊者可以假冒合法用戶進行未經授權的操作。

如何防範中間人攻擊

  1. 使用加密通信:採用 HTTPS 和端對端加密來確保通信內容的安全。
  2. 驗證憑證:檢查網站的數位憑證,確保它們是由可信賴的證書頒發機構(CA)簽發的。
  3. 使用 VPN:在不安全的網路上,使用虛擬私人網路(VPN)來加密所有通信。
  4. 避免公共 Wi-Fi:儘量避免使用未加密的公共 Wi-Fi,這些網路容易成為攻擊者的目標。
  5. 啟用雙重認證:使用雙重認證來增強賬戶的安全性,即使密碼被攔截,攻擊者也難以登入賬戶。

中間人攻擊是一種強大且危險的攻擊方式,因此保護通信的安全性和完整性是非常重要的。

針對防止中間人攻擊的各種技術,以下提供一些相關的程式碼示例,主要涵蓋加密通信、數位憑證驗證及公私鑰加密等實現方式。這些程式碼可以用來參考如何在實際應用中防範中間人攻擊。

1. HTTPS/TLS 在 Python 中的應用

如果你要在 Python 中實現 HTTPS/TLS 安全通信,可以使用 requests 庫來發送 HTTPS 請求。

import requests

# 向使用 HTTPS 的網站發送 GET 請求
response = requests.get('https://example.com', verify=True)

# 輸出返回的內容
print(response.text)

這裡的 verify=True 會自動檢查網站的 SSL 憑證,確保通信是加密且安全的。

2. Java 中的 SSL/TLS 實現

在 Java 中,你可以使用 HttpsURLConnection 來實現 HTTPS 安全通信。

import javax.net.ssl.HttpsURLConnection;
import java.net.URL;
import java.io.InputStreamReader;
import java.io.BufferedReader;

public class SecureConnectionExample {
    public static void main(String[] args) {
        try {
            URL url = new URL("https://example.com");
            HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();
            connection.setRequestMethod("GET");
            
            // 驗證 SSL 憑證
            connection.setSSLSocketFactory((SSLSocketFactory) SSLSocketFactory.getDefault());
            
            BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
            String line;
            while ((line = reader.readLine()) != null) {
                System.out.println(line);
            }
            reader.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

這段程式碼展示了如何使用 Java 的 HttpsURLConnection 來進行 HTTPS 請求,同時自動檢查 SSL 憑證。

3. Python 中的 RSA 公私鑰加密

這是如何使用 Python 的 cryptography 庫來實現 RSA 公私鑰加密的簡單示例。

from cryptography.hazmat.primitives.asymmetric import rsa, padding
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives import serialization

# 生成 RSA 密鑰對
private_key = rsa.generate_private_key(public_exponent=65537, key_size=2048)
public_key = private_key.public_key()

# 將公鑰序列化為 PEM 格式
pem_public_key = public_key.public_bytes(encoding=serialization.Encoding.PEM,
                                         format=serialization.PublicFormat.SubjectPublicKeyInfo)

# 用公鑰加密數據
message = b"Secure message"
ciphertext = public_key.encrypt(
    message,
    padding.OAEP(
        mgf=padding.MGF1(algorithm=hashes.SHA256()),
        algorithm=hashes.SHA256(),
        label=None
    )
)

# 用私鑰解密數據
decrypted_message = private_key.decrypt(
    ciphertext,
    padding.OAEP(
        mgf=padding.MGF1(algorithm=hashes.SHA256()),
        algorithm=hashes.SHA256(),
        label=None
    )
)

print("Decrypted message:", decrypted_message.decode())

這段程式碼生成了一對 RSA 公私鑰,並使用公鑰加密消息,再使用私鑰解密,確保通信過程中的數據安全。

4. Java 中的數位簽章驗證

在 Java 中,你可以使用 java.security 包來生成和驗證數位簽章,保護數據的完整性。

import java.security.*;

public class DigitalSignatureExample {
    public static void main(String[] args) {
        try {
            // 生成密鑰對
            KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");
            keyPairGen.initialize(2048);
            KeyPair pair = keyPairGen.generateKeyPair();
            PrivateKey privateKey = pair.getPrivate();
            PublicKey publicKey = pair.getPublic();

            // 生成數位簽章
            Signature sign = Signature.getInstance("SHA256withRSA");
            sign.initSign(privateKey);
            String message = "This is a confidential message";
            sign.update(message.getBytes());
            byte[] signature = sign.sign();
            
            // 驗證數位簽章
            sign.initVerify(publicKey);
            sign.update(message.getBytes());
            boolean isVerified = sign.verify(signature);

            System.out.println("Signature verified: " + isVerified);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

這段程式碼展示了如何生成一個 RSA 密鑰對,並使用私鑰來對消息進行數位簽章,然後再使用公鑰驗證該簽章是否有效。

這些程式碼示例涉及了防止中間人攻擊的不同技術,具體選擇哪種技術來保護通信,取決於應用場景和需求。


上一篇
網頁最重要的一環—網頁安全技術技術(HTTP)
下一篇
DAY3如何撰寫憑證
系列文
一個網頁的誕生!教你從基礎到自行完成設計網站30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言